package plugin

import (
	"encoding/json"
	"os"
	"path/filepath"
	"plugin"
)

// Loader 插件加载器
type Loader struct {
	pluginDir string
}

func NewLoader(pluginDir string) *Loader {
	return &Loader{
		pluginDir: pluginDir,
	}
}

// LoadPlugin 从.so文件加载插件
func (l *Loader) LoadPlugin(name string) (Plugin, error) {
	path := filepath.Join(l.pluginDir, name+".so")

	// 加载.so文件
	p, err := plugin.Open(path)
	if err != nil {
		return nil, err
	}

	// 查找New函数
	symbol, err := p.Lookup("New")
	if err != nil {
		return nil, err
	}

	// 类型断言为插件构造函数
	newFunc, ok := symbol.(func() Plugin)
	if !ok {
		return nil, ErrInvalidPluginConfig
	}

	// 创建插件实例
	return newFunc(), nil
}

// LoadConfig 加载插件配置
func (l *Loader) LoadConfig(name string) (map[string]interface{}, error) {
	path := filepath.Join(l.pluginDir, name+".json")

	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}

	var config map[string]interface{}
	if err := json.Unmarshal(data, &config); err != nil {
		return nil, err
	}

	return config, nil
}
